1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.primitives;
18
19 import com.google.common.annotations.GwtCompatible;
20 import com.google.common.base.Converter;
21 import com.google.common.collect.testing.Helpers;
22
23 import junit.framework.TestCase;
24
25 import java.util.Arrays;
26 import java.util.Collection;
27 import java.util.Collections;
28 import java.util.Comparator;
29 import java.util.List;
30
31
32
33
34
35
36 @GwtCompatible(emulated = true)
37 @SuppressWarnings("cast")
38 public class ShortsTest extends TestCase {
39 private static final short[] EMPTY = {};
40 private static final short[] ARRAY1 = {(short) 1};
41 private static final short[] ARRAY234
42 = {(short) 2, (short) 3, (short) 4};
43
44 private static final short LEAST = Short.MIN_VALUE;
45 private static final short GREATEST = Short.MAX_VALUE;
46
47 private static final short[] VALUES =
48 { LEAST, (short) -1, (short) 0, (short) 1, GREATEST };
49
50 public void testHashCode() {
51 for (short value : VALUES) {
52 assertEquals(((Short) value).hashCode(), Shorts.hashCode(value));
53 }
54 }
55
56 public void testCheckedCast() {
57 for (short value : VALUES) {
58 assertEquals(value, Shorts.checkedCast((long) value));
59 }
60 assertCastFails(GREATEST + 1L);
61 assertCastFails(LEAST - 1L);
62 assertCastFails(Long.MAX_VALUE);
63 assertCastFails(Long.MIN_VALUE);
64 }
65
66 public void testSaturatedCast() {
67 for (short value : VALUES) {
68 assertEquals(value, Shorts.saturatedCast((long) value));
69 }
70 assertEquals(GREATEST, Shorts.saturatedCast(GREATEST + 1L));
71 assertEquals(LEAST, Shorts.saturatedCast(LEAST - 1L));
72 assertEquals(GREATEST, Shorts.saturatedCast(Long.MAX_VALUE));
73 assertEquals(LEAST, Shorts.saturatedCast(Long.MIN_VALUE));
74 }
75
76 private static void assertCastFails(long value) {
77 try {
78 Shorts.checkedCast(value);
79 fail("Cast to short should have failed: " + value);
80 } catch (IllegalArgumentException ex) {
81 assertTrue(value + " not found in exception text: " + ex.getMessage(),
82 ex.getMessage().contains(String.valueOf(value)));
83 }
84 }
85
86 public void testCompare() {
87 for (short x : VALUES) {
88 for (short y : VALUES) {
89
90 int expected = Short.valueOf(x).compareTo(y);
91 int actual = Shorts.compare(x, y);
92 if (expected == 0) {
93 assertEquals(x + ", " + y, expected, actual);
94 } else if (expected < 0) {
95 assertTrue(x + ", " + y + " (expected: " + expected + ", actual" + actual + ")",
96 actual < 0);
97 } else {
98 assertTrue(x + ", " + y + " (expected: " + expected + ", actual" + actual + ")",
99 actual > 0);
100 }
101 }
102 }
103 }
104
105 public void testContains() {
106 assertFalse(Shorts.contains(EMPTY, (short) 1));
107 assertFalse(Shorts.contains(ARRAY1, (short) 2));
108 assertFalse(Shorts.contains(ARRAY234, (short) 1));
109 assertTrue(Shorts.contains(new short[] {(short) -1}, (short) -1));
110 assertTrue(Shorts.contains(ARRAY234, (short) 2));
111 assertTrue(Shorts.contains(ARRAY234, (short) 3));
112 assertTrue(Shorts.contains(ARRAY234, (short) 4));
113 }
114
115 public void testIndexOf() {
116 assertEquals(-1, Shorts.indexOf(EMPTY, (short) 1));
117 assertEquals(-1, Shorts.indexOf(ARRAY1, (short) 2));
118 assertEquals(-1, Shorts.indexOf(ARRAY234, (short) 1));
119 assertEquals(0, Shorts.indexOf(
120 new short[] {(short) -1}, (short) -1));
121 assertEquals(0, Shorts.indexOf(ARRAY234, (short) 2));
122 assertEquals(1, Shorts.indexOf(ARRAY234, (short) 3));
123 assertEquals(2, Shorts.indexOf(ARRAY234, (short) 4));
124 assertEquals(1, Shorts.indexOf(
125 new short[] { (short) 2, (short) 3, (short) 2, (short) 3 },
126 (short) 3));
127 }
128
129 public void testIndexOf_arrayTarget() {
130 assertEquals(0, Shorts.indexOf(EMPTY, EMPTY));
131 assertEquals(0, Shorts.indexOf(ARRAY234, EMPTY));
132 assertEquals(-1, Shorts.indexOf(EMPTY, ARRAY234));
133 assertEquals(-1, Shorts.indexOf(ARRAY234, ARRAY1));
134 assertEquals(-1, Shorts.indexOf(ARRAY1, ARRAY234));
135 assertEquals(0, Shorts.indexOf(ARRAY1, ARRAY1));
136 assertEquals(0, Shorts.indexOf(ARRAY234, ARRAY234));
137 assertEquals(0, Shorts.indexOf(
138 ARRAY234, new short[] { (short) 2, (short) 3 }));
139 assertEquals(1, Shorts.indexOf(
140 ARRAY234, new short[] { (short) 3, (short) 4 }));
141 assertEquals(1, Shorts.indexOf(ARRAY234, new short[] { (short) 3 }));
142 assertEquals(2, Shorts.indexOf(ARRAY234, new short[] { (short) 4 }));
143 assertEquals(1, Shorts.indexOf(new short[] { (short) 2, (short) 3,
144 (short) 3, (short) 3, (short) 3 },
145 new short[] { (short) 3 }
146 ));
147 assertEquals(2, Shorts.indexOf(
148 new short[] { (short) 2, (short) 3, (short) 2,
149 (short) 3, (short) 4, (short) 2, (short) 3},
150 new short[] { (short) 2, (short) 3, (short) 4}
151 ));
152 assertEquals(1, Shorts.indexOf(
153 new short[] { (short) 2, (short) 2, (short) 3,
154 (short) 4, (short) 2, (short) 3, (short) 4},
155 new short[] { (short) 2, (short) 3, (short) 4}
156 ));
157 assertEquals(-1, Shorts.indexOf(
158 new short[] { (short) 4, (short) 3, (short) 2},
159 new short[] { (short) 2, (short) 3, (short) 4}
160 ));
161 }
162
163 public void testLastIndexOf() {
164 assertEquals(-1, Shorts.lastIndexOf(EMPTY, (short) 1));
165 assertEquals(-1, Shorts.lastIndexOf(ARRAY1, (short) 2));
166 assertEquals(-1, Shorts.lastIndexOf(ARRAY234, (short) 1));
167 assertEquals(0, Shorts.lastIndexOf(
168 new short[] {(short) -1}, (short) -1));
169 assertEquals(0, Shorts.lastIndexOf(ARRAY234, (short) 2));
170 assertEquals(1, Shorts.lastIndexOf(ARRAY234, (short) 3));
171 assertEquals(2, Shorts.lastIndexOf(ARRAY234, (short) 4));
172 assertEquals(3, Shorts.lastIndexOf(
173 new short[] { (short) 2, (short) 3, (short) 2, (short) 3 },
174 (short) 3));
175 }
176
177 public void testMax_noArgs() {
178 try {
179 Shorts.max();
180 fail();
181 } catch (IllegalArgumentException expected) {
182 }
183 }
184
185 public void testMax() {
186 assertEquals(LEAST, Shorts.max(LEAST));
187 assertEquals(GREATEST, Shorts.max(GREATEST));
188 assertEquals((short) 9, Shorts.max(
189 (short) 8, (short) 6, (short) 7,
190 (short) 5, (short) 3, (short) 0, (short) 9));
191 }
192
193 public void testMin_noArgs() {
194 try {
195 Shorts.min();
196 fail();
197 } catch (IllegalArgumentException expected) {
198 }
199 }
200
201 public void testMin() {
202 assertEquals(LEAST, Shorts.min(LEAST));
203 assertEquals(GREATEST, Shorts.min(GREATEST));
204 assertEquals((short) 0, Shorts.min(
205 (short) 8, (short) 6, (short) 7,
206 (short) 5, (short) 3, (short) 0, (short) 9));
207 }
208
209 public void testConcat() {
210 assertTrue(Arrays.equals(EMPTY, Shorts.concat()));
211 assertTrue(Arrays.equals(EMPTY, Shorts.concat(EMPTY)));
212 assertTrue(Arrays.equals(EMPTY, Shorts.concat(EMPTY, EMPTY, EMPTY)));
213 assertTrue(Arrays.equals(ARRAY1, Shorts.concat(ARRAY1)));
214 assertNotSame(ARRAY1, Shorts.concat(ARRAY1));
215 assertTrue(Arrays.equals(ARRAY1, Shorts.concat(EMPTY, ARRAY1, EMPTY)));
216 assertTrue(Arrays.equals(
217 new short[] {(short) 1, (short) 1, (short) 1},
218 Shorts.concat(ARRAY1, ARRAY1, ARRAY1)));
219 assertTrue(Arrays.equals(
220 new short[] {(short) 1, (short) 2, (short) 3, (short) 4},
221 Shorts.concat(ARRAY1, ARRAY234)));
222 }
223
224 public void testEnsureCapacity() {
225 assertSame(EMPTY, Shorts.ensureCapacity(EMPTY, 0, 1));
226 assertSame(ARRAY1, Shorts.ensureCapacity(ARRAY1, 0, 1));
227 assertSame(ARRAY1, Shorts.ensureCapacity(ARRAY1, 1, 1));
228 assertTrue(Arrays.equals(
229 new short[] {(short) 1, (short) 0, (short) 0},
230 Shorts.ensureCapacity(ARRAY1, 2, 1)));
231 }
232
233 public void testEnsureCapacity_fail() {
234 try {
235 Shorts.ensureCapacity(ARRAY1, -1, 1);
236 fail();
237 } catch (IllegalArgumentException expected) {
238 }
239 try {
240
241 Shorts.ensureCapacity(ARRAY1, 1, -1);
242 fail();
243 } catch (IllegalArgumentException expected) {
244 }
245 }
246
247 public void testJoin() {
248 assertEquals("", Shorts.join(",", EMPTY));
249 assertEquals("1", Shorts.join(",", ARRAY1));
250 assertEquals("1,2", Shorts.join(",", (short) 1, (short) 2));
251 assertEquals("123",
252 Shorts.join("", (short) 1, (short) 2, (short) 3));
253 }
254
255 public void testLexicographicalComparator() {
256 List<short[]> ordered = Arrays.asList(
257 new short[] {},
258 new short[] {LEAST},
259 new short[] {LEAST, LEAST},
260 new short[] {LEAST, (short) 1},
261 new short[] {(short) 1},
262 new short[] {(short) 1, LEAST},
263 new short[] {GREATEST, GREATEST - (short) 1},
264 new short[] {GREATEST, GREATEST},
265 new short[] {GREATEST, GREATEST, GREATEST});
266
267 Comparator<short[]> comparator = Shorts.lexicographicalComparator();
268 Helpers.testComparator(comparator, ordered);
269 }
270
271 public void testToArray() {
272
273 List<Short> none = Arrays.<Short>asList();
274 assertTrue(Arrays.equals(EMPTY, Shorts.toArray(none)));
275
276 List<Short> one = Arrays.asList((short) 1);
277 assertTrue(Arrays.equals(ARRAY1, Shorts.toArray(one)));
278
279 short[] array = {(short) 0, (short) 1, (short) 3};
280
281 List<Short> three = Arrays.asList((short) 0, (short) 1, (short) 3);
282 assertTrue(Arrays.equals(array, Shorts.toArray(three)));
283
284 assertTrue(Arrays.equals(array, Shorts.toArray(Shorts.asList(array))));
285 }
286
287 public void testToArray_threadSafe() {
288 for (int delta : new int[] { +1, 0, -1 }) {
289 for (int i = 0; i < VALUES.length; i++) {
290 List<Short> list = Shorts.asList(VALUES).subList(0, i);
291 Collection<Short> misleadingSize =
292 Helpers.misleadingSizeCollection(delta);
293 misleadingSize.addAll(list);
294 short[] arr = Shorts.toArray(misleadingSize);
295 assertEquals(i, arr.length);
296 for (int j = 0; j < i; j++) {
297 assertEquals(VALUES[j], arr[j]);
298 }
299 }
300 }
301 }
302
303 public void testToArray_withNull() {
304 List<Short> list = Arrays.asList((short) 0, (short) 1, null);
305 try {
306 Shorts.toArray(list);
307 fail();
308 } catch (NullPointerException expected) {
309 }
310 }
311
312 public void testToArray_withConversion() {
313 short[] array = {(short) 0, (short) 1, (short) 2};
314
315 List<Byte> bytes = Arrays.asList((byte) 0, (byte) 1, (byte) 2);
316 List<Short> shorts = Arrays.asList((short) 0, (short) 1, (short) 2);
317 List<Integer> ints = Arrays.asList(0, 1, 2);
318 List<Float> floats = Arrays.asList((float) 0, (float) 1, (float) 2);
319 List<Long> longs = Arrays.asList((long) 0, (long) 1, (long) 2);
320 List<Double> doubles = Arrays.asList((double) 0, (double) 1, (double) 2);
321
322 assertTrue(Arrays.equals(array, Shorts.toArray(bytes)));
323 assertTrue(Arrays.equals(array, Shorts.toArray(shorts)));
324 assertTrue(Arrays.equals(array, Shorts.toArray(ints)));
325 assertTrue(Arrays.equals(array, Shorts.toArray(floats)));
326 assertTrue(Arrays.equals(array, Shorts.toArray(longs)));
327 assertTrue(Arrays.equals(array, Shorts.toArray(doubles)));
328 }
329
330 public void testAsList_isAView() {
331 short[] array = {(short) 0, (short) 1};
332 List<Short> list = Shorts.asList(array);
333 list.set(0, (short) 2);
334 assertTrue(Arrays.equals(new short[] {(short) 2, (short) 1}, array));
335 array[1] = (short) 3;
336 assertEquals(Arrays.asList((short) 2, (short) 3), list);
337 }
338
339 public void testAsList_toArray_roundTrip() {
340 short[] array = { (short) 0, (short) 1, (short) 2 };
341 List<Short> list = Shorts.asList(array);
342 short[] newArray = Shorts.toArray(list);
343
344
345 list.set(0, (short) 4);
346 assertTrue(Arrays.equals(
347 new short[] { (short) 0, (short) 1, (short) 2 }, newArray));
348 newArray[1] = (short) 5;
349 assertEquals((short) 1, (short) list.get(1));
350 }
351
352
353 public void testAsList_subList_toArray_roundTrip() {
354 short[] array = { (short) 0, (short) 1, (short) 2, (short) 3 };
355 List<Short> list = Shorts.asList(array);
356 assertTrue(Arrays.equals(new short[] { (short) 1, (short) 2 },
357 Shorts.toArray(list.subList(1, 3))));
358 assertTrue(Arrays.equals(new short[] {},
359 Shorts.toArray(list.subList(2, 2))));
360 }
361
362 public void testAsListEmpty() {
363 assertSame(Collections.emptyList(), Shorts.asList(EMPTY));
364 }
365
366 public void testStringConverter_convert() {
367 Converter<String, Short> converter = Shorts.stringConverter();
368 assertEquals((Short) (short) 1, converter.convert("1"));
369 assertEquals((Short) (short) 0, converter.convert("0"));
370 assertEquals((Short) (short) (-1), converter.convert("-1"));
371 assertEquals((Short) (short) 255, converter.convert("0xff"));
372 assertEquals((Short) (short) 255, converter.convert("0xFF"));
373 assertEquals((Short) (short) (-255), converter.convert("-0xFF"));
374 assertEquals((Short) (short) 255, converter.convert("#0000FF"));
375 assertEquals((Short) (short) 438, converter.convert("0666"));
376 }
377
378 public void testStringConverter_convertError() {
379 try {
380 Shorts.stringConverter().convert("notanumber");
381 fail();
382 } catch (NumberFormatException expected) {
383 }
384 }
385
386 public void testStringConverter_nullConversions() {
387 assertNull(Shorts.stringConverter().convert(null));
388 assertNull(Shorts.stringConverter().reverse().convert(null));
389 }
390
391 public void testStringConverter_reverse() {
392 Converter<String, Short> converter = Shorts.stringConverter();
393 assertEquals("1", converter.reverse().convert((short) 1));
394 assertEquals("0", converter.reverse().convert((short) 0));
395 assertEquals("-1", converter.reverse().convert((short) -1));
396 assertEquals("255", converter.reverse().convert((short) 0xff));
397 assertEquals("255", converter.reverse().convert((short) 0xFF));
398 assertEquals("-255", converter.reverse().convert((short) -0xFF));
399 assertEquals("438", converter.reverse().convert((short) 0666));
400 }
401 }
402